//
//  APIRequestBehavior.swift
//  Casecord
//
//  Created by baozi on 2024/1/3.
//

import Foundation

enum APIRequestBehavior: Equatable, Hashable, CustomStringConvertible {
    
    /**
     隐藏状态栏左上角的网络请求图标，
     当一些请求并非用户主动触发时使用，
     如获取配置、上报日志等
     */
    case hideActivityIndicator
    
    /**
     报错后不弹出错误信息
     
     常用于：
     - 执行一些非用户主动出发的请求
     - 请求错误不影响正常的业务流程
     - 服务端报的特定错误码有特定的处理逻辑，不需要展示通用的错误信息吐司
     
     - Parameters:
     - codes: 指定不弹出错误信息的错误码
     */
    case suppressMessage(_ codes: [Int]? = nil)
    
    /**
     自定义请求超时时间
     
     默认为 15s
     */
    case customTimeout(TimeInterval? = nil)
    
    /**
     失败后重试
     
     - Parameters:
     - upTo: 最多重试次数
     - maxInterval: 两次重试间的时间间隔，backoff 策略
     - when: 根据 error 判断是否需要重试，参见 `APIError.retry()`
     */
    case retry(upTo: Int = 3, maxInterval: TimeInterval = 3, when: ((Error) -> Bool) = APIError.retryTest())
    
    public func hash(into hasher: inout Hasher) {
        hasher.combine(caseName)
    }
    
    public var caseName: String {
        switch self {
        case .hideActivityIndicator:
            return "hideActivityIndicator"
        case .suppressMessage:
            return "suppressMessage"
        case .customTimeout:
            return "customTimeout"
        case .retry:
            return "retry"
        }
    }
    
    public var description: String {
        ""
        //        var params = [caseName]
        //        switch self {
        //        case let .customTimeout(timeout):
        //            params += ["\(timeout ?? 15)"]
        //        default:
        //            break
        //        }
        //        return params.joined(separator: Self.requestBehaviorParamSeparator)
    }
    
    public static func == (lhs: APIRequestBehavior, rhs: APIRequestBehavior) -> Bool {
        lhs.hashValue == rhs.hashValue
    }
}
